home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 10 / AACD 10.iso / AACD / Games / MAME / src / vidhrdw / tail2nos.c < prev    next >
C/C++ Source or Header  |  2000-04-12  |  6KB  |  249 lines

  1. #include "driver.h"
  2. #include "vidhrdw/generic.h"
  3. #include "konamiic.h"
  4.  
  5.  
  6. unsigned char *tail2nos_bgvideoram;
  7.  
  8.  
  9. static struct tilemap *bg_tilemap;
  10.  
  11. static int charbank,charpalette,video_enable;
  12. static unsigned char *zoomdata;
  13. static int dirtygfx;
  14. static unsigned char *dirtychar;
  15.  
  16. #define TOTAL_CHARS 0x400
  17.  
  18.  
  19. /***************************************************************************
  20.  
  21.   Callbacks for the TileMap code
  22.  
  23. ***************************************************************************/
  24.  
  25. static void get_tile_info(int tile_index)
  26. {
  27.     UINT16 code = READ_WORD(&tail2nos_bgvideoram[2*tile_index]);
  28.     SET_TILE_INFO(0,(code & 0x1fff) + (charbank << 13),((code & 0xe000) >> 13) + charpalette * 16)
  29. }
  30.  
  31.  
  32. /***************************************************************************
  33.  
  34.   Callbacks for the K051316
  35.  
  36. ***************************************************************************/
  37.  
  38. static void zoom_callback(int *code,int *color)
  39. {
  40.     *code |= ((*color & 0x03) << 8);
  41.     *color = 32 + ((*color & 0x38) >> 3);
  42. }
  43.  
  44. /***************************************************************************
  45.  
  46.     Start the video hardware emulation.
  47.  
  48. ***************************************************************************/
  49.  
  50. int tail2nos_vh_start(void)
  51. {
  52.     bg_tilemap = tilemap_create(get_tile_info,tilemap_scan_rows,TILEMAP_TRANSPARENT,8,8,64,32);
  53.  
  54.     if (!bg_tilemap)
  55.         return 1;
  56.  
  57.     if (K051316_vh_start_0(REGION_GFX3,4,zoom_callback))
  58.         return 1;
  59.  
  60.     if (!(dirtychar = malloc(TOTAL_CHARS)))
  61.     {
  62.         K051316_vh_stop_0();
  63.         return 1;
  64.     }
  65.     memset(dirtychar,1,TOTAL_CHARS);
  66.  
  67.     bg_tilemap->transparent_pen = 15;
  68.  
  69.     K051316_wraparound_enable(0,1);
  70.     K051316_set_offset(0,-89,-14);
  71.     zoomdata = memory_region(REGION_GFX3);
  72.  
  73.     return 0;
  74. }
  75.  
  76. void tail2nos_vh_stop(void)
  77. {
  78.     K051316_vh_stop_0();
  79.     free(dirtychar);
  80.     dirtychar = 0;
  81. }
  82.  
  83.  
  84.  
  85. /***************************************************************************
  86.  
  87.   Memory handlers
  88.  
  89. ***************************************************************************/
  90.  
  91. READ_HANDLER( tail2nos_bgvideoram_r )
  92. {
  93.     return READ_WORD(&tail2nos_bgvideoram[offset]);
  94. }
  95.  
  96. WRITE_HANDLER( tail2nos_bgvideoram_w )
  97. {
  98.     int oldword = READ_WORD(&tail2nos_bgvideoram[offset]);
  99.     int newword = COMBINE_WORD(oldword,data);
  100.  
  101.     if (oldword != newword)
  102.     {
  103.         WRITE_WORD(&tail2nos_bgvideoram[offset],newword);
  104.         tilemap_mark_tile_dirty(bg_tilemap,offset/2);
  105.     }
  106. }
  107.  
  108. READ_HANDLER( tail2nos_zoomdata_r )
  109. {
  110.     return READ_WORD(&zoomdata[offset]);
  111. }
  112.  
  113. WRITE_HANDLER( tail2nos_zoomdata_w )
  114. {
  115.     int oldword = READ_WORD(&zoomdata[offset]);
  116.     int newword = COMBINE_WORD(oldword,data);
  117.  
  118.     if (oldword != newword)
  119.     {
  120.         dirtygfx = 1;
  121.         dirtychar[offset / 128] = 1;
  122.         WRITE_WORD(&zoomdata[offset],newword);
  123.     }
  124. }
  125.  
  126. WRITE_HANDLER( tail2nos_gfxbank_w )
  127. {
  128.     if ((data & 0x00ff0000) == 0)
  129.     {
  130.         int bank;
  131.  
  132.         /* bits 0 and 2 select char bank */
  133.         if (data & 0x04) bank = 2;
  134.         else if (data & 0x01) bank = 1;
  135.         else bank = 0;
  136.  
  137.         if (charbank != bank)
  138.         {
  139.             charbank = bank;
  140.             tilemap_mark_all_tiles_dirty(bg_tilemap);
  141.         }
  142.  
  143.         /* bit 5 seems to select palette bank (used on startup) */
  144.         if (data & 0x20) bank = 7;
  145.         else bank = 3;
  146.  
  147.         if (charpalette != bank)
  148.         {
  149.             charpalette = bank;
  150.             tilemap_mark_all_tiles_dirty(bg_tilemap);
  151.         }
  152.  
  153.         /* bit 4 seems to be video enable */
  154.         video_enable = data & 0x10;
  155.     }
  156. }
  157.  
  158.  
  159. /***************************************************************************
  160.  
  161.     Display Refresh
  162.  
  163. ***************************************************************************/
  164.  
  165. static void drawsprites(struct osd_bitmap *bitmap)
  166. {
  167.     int offs;
  168.  
  169.  
  170.     for (offs = 0;offs < spriteram_size;offs += 8)
  171.     {
  172.         int sx,sy,flipx,flipy,code,color;
  173.  
  174.         sx = READ_WORD(&spriteram[offs + 2]);
  175.         if (sx >= 0x8000) sx -= 0x10000;
  176.         sy = 0x10000 - READ_WORD(&spriteram[offs + 0]);
  177.         if (sy >= 0x8000) sy -= 0x10000;
  178.         code = READ_WORD(&spriteram[offs + 4]) & 0x07ff;
  179.         color = (READ_WORD(&spriteram[offs + 4]) & 0xe000) >> 13;
  180.         flipx = READ_WORD(&spriteram[offs + 4]) & 0x1000;
  181.         flipy = READ_WORD(&spriteram[offs + 4]) & 0x0800;
  182.  
  183.         drawgfx(bitmap,Machine->gfx[1],
  184.                 code,
  185.                 40 + color,
  186.                 flipx,flipy,
  187.                 sx+3,sy+1,    /* placement relative to zoom layer verified on the real thing */
  188.                 &Machine->drv->visible_area,TRANSPARENCY_PEN,15);
  189.     }
  190. }
  191.  
  192. void tail2nos_vh_screenrefresh(struct osd_bitmap *bitmap,int full_refresh)
  193. {
  194.     static struct GfxLayout tilelayout =
  195.     {
  196.         16,16,
  197.         TOTAL_CHARS,
  198.         4,
  199.         { 0, 1, 2, 3 },
  200. #ifdef LSB_FIRST
  201.         { 2*4, 3*4, 0*4, 1*4, 6*4, 7*4, 4*4, 5*4,
  202.                 10*4, 11*4, 8*4, 9*4, 14*4, 15*4, 12*4, 13*4 },
  203. #else
  204.         { 0*4, 1*4, 2*4, 3*4, 4*4, 5*4, 6*4, 7*4,
  205.                 8*4, 9*4, 10*4, 11*4, 12*4, 13*4, 14*4, 15*4 },
  206. #endif
  207.         { 0*64, 1*64, 2*64, 3*64, 4*64, 5*64, 6*64, 7*64,
  208.                 8*64, 9*64, 10*64, 11*64, 12*64, 13*64, 14*64, 15*64 },
  209.         128*8
  210.     };
  211.  
  212.  
  213.     if (dirtygfx)
  214.     {
  215.         int i;
  216.  
  217.         dirtygfx = 0;
  218.  
  219.         for (i = 0;i < TOTAL_CHARS;i++)
  220.         {
  221.             if (dirtychar[i])
  222.             {
  223.                 dirtychar[i] = 0;
  224.                 decodechar(Machine->gfx[2],i,zoomdata,&tilelayout);
  225.             }
  226.         }
  227.  
  228.         tilemap_mark_all_tiles_dirty(ALL_TILEMAPS);
  229.     }
  230.  
  231.  
  232.     K051316_tilemap_update_0();
  233.     tilemap_update(bg_tilemap);
  234.  
  235.     if (palette_recalc())
  236.         tilemap_mark_all_pixels_dirty(ALL_TILEMAPS);
  237.  
  238.     tilemap_render(ALL_TILEMAPS);
  239.  
  240.     if (video_enable)
  241.     {
  242.         K051316_zoom_draw_0(bitmap,0);
  243.         drawsprites(bitmap);
  244.         tilemap_draw(bitmap,bg_tilemap,0);
  245.     }
  246.     else
  247.         fillbitmap(bitmap,Machine->pens[0],&Machine->drv->visible_area);
  248. }
  249.